<?php
/**
 * file is class for processing database
 * @version 1.0
 * @package EMX
 * author:
 */
 
/**
 * Lớp liên quan đến cơ sở dữ liệu, truy suât và tạo kết quả từ chuỗi truy vấn
 * @package EMX
 * @subpackage classes
 */
class clsDatabase
{
	/**
    * @access private
     * @var integer	
	**/
	var $conn=null;
	
     /**
     * getObject lấy đối tượng từ kết quả của câu lệnh truy vấn 
     * @Return object
     * @param string $sql, sql là câu lệnh select
     * @return trả về dối tượng từ câu truy vấn
	*/
	function getObject($sql)
	{
		$obj=null;
		try{
			$result = mysql_query($sql);
			$obj = mysql_fetch_object($result);
		}catch (Exception $e){
			return null;
		}
		return $obj;
	}
     /**
     * getObjectArray lấy ra mảng các đối tượng dữ liệu
     * @param string $sql, sql là câu lệnh select
     * @return trả về mảng các dối tượng dữ liệu
     */
	function getObjectArray($sql)
	{
		$arrObj = array();
		try{
			$result = mysql_query($sql);
		}catch (Exception $e){
			return null;
		}
		
		while($row = mysql_fetch_object($result)){
			$arrObj[] = $row;
		}
		return $arrObj;
		
	}
    /**
     * configTables lấy thông tin cấu hình của bảng .Yhông tin này chưa trong bảngtb-config_table
     * @param string $tableName, tên của bảng cần lấy thông tin
     * @param string $fieldName, name of field get name to array index
     * @return trả về kết quả theo tableName
     */
	function configTables($tableName,$fieldName="tablename")
	{
		$sql="";
		$sql="SELECT
			A1.id,
			A1.tablename,
			A1.realname,
			A1.listtitle,
			A1.edittitle,
			A1.addtitle
			FROM
			tb_config_tables AS A1
			WHERE
			A1.tablename =  '$tableName'"	;
		
		if(isset($this->conn)){
			$result=mysql_query($sql,$this->conn) or die("Not query fns_Rows");
		}
		else{
			$result=mysql_query($sql) or die("Not query fns_Rows");
		}
		$rows=array();
		while($r=mysql_fetch_array($result)){
			$rows[$r[$fieldName]]=$r;
		}
		return $rows;
		
	}
    /**
     * Trả về thông tin các trường cấu hình trong bảng tb_config_field
     * @param string $tableName, tên của bảng cần lấy thông tin
     * @param string $fieldname, tên của trường để tạo mảng
     * @return trả về kết quả thông tin trường dựa theo $tableName
     */
	function configFields($tableName,$fieldname="fieldname")
	{
		$sql="";
		$sql="SELECT
			A1.id,
			A2.tablename,
			A1.fieldname,
			A1.realname,
			A1.listtitle,
			A1.linetitle,
			A1.`type`,
			A1.size,
			A1.`default`,
			A1.minvalue,
			A1.maxvalue,
			A1.displaylist,
			A1.displayline,
			A1.editable,
			A1.addable,
			A1.find			
			FROM
			tb_config_fields AS A1 inner join
			tb_config_tables AS A2
			ON A1.table=A2.ID
			WHERE
			A2.tablename =  '$tableName'"	;
		
		if(isset($this->conn)){
			$result=mysql_query($sql,$this->conn) or die("Not query fns_Rows");
		}
		else{
			$result=mysql_query($sql) or die("Not query fns_Rows");
		}
//		echo $sql;
		$rows=array();
		while($r=mysql_fetch_array($result)){
			$rows[$r[$fieldname]]=$r;
		}
		return $rows;
	
	}
     /**
     * set_Connection Thiết lập biến kết nối csdl
     * @param $con, biến liên kết đến csdl
     */
	 function set_Connection( $con)	
	{
		$this->conn=$con;
	}
    /**
     * clear_Connection Hủy kết nối đến csdl
     * @param $con, biến liên kết đến csdl
     */
	function clear_Connection()
	{
		unset( $this->conn);
	}
    /**
     * IsRow Trả về giá trị kiểu bool dựa theo câu truy vấn có kết quả hay không
     * @param string $sql, câu lệnh truy vấn
     * @return trả về false nếu kết quả tìm thấy là 0 dònd, nếu kết quả > dòng sẽ trả về true.
     */
	function IsRow($sql)
	{
		if(isset($this->conn))		{
			$result=mysql_query($sql,$this->conn) or die("Not query fns_IsRecord");
		}
		else{
			$result=mysql_query($sql) or die("Not query fns_IsRecord23232");
		}
		if(mysql_num_rows($result)) return true;
		else return false;
	}
    /**
     * Trả về mảng các dòng từ câu lệnh selecy
     * @param string $sql, sql slệnh truy vấn cần xử lý
     * @return trả về mảng các dòng với khóa là các field
     */
	function NumRow($sql)
	{
		if(isset($this->conn)){
			$result=mysql_query($sql,$this->conn) or die("Not query fns_IsRecord");
		}
		else{
			$result=mysql_query($sql) or die("Not query fns_IsRecord");
		}

		$r=mysql_fetch_array($result,MYSQL_NUM);
		return $r[0];
	}
	/**
     * Trả về 1 mảng được sẽ đựoc thao tác boiử lớp smarty dùng cho section hoặc foreach
     * @param string $sql, câu lệnh truy vấn
     * @param string $numrow
     * @return trả về mảng có dạng array(array()[,array()])
     */
	function GetRowsAndCount($sql,$numrow)
	{
		echo $sql;
		$result=mysql_query($sql) or die("Not query fns_IsRecord");
		$numrow=mysql_num_rows($result);
		$rows=array();
		while($r=mysql_fetch_array($result)){
			$rows[]=$r;
		}
		return $rows;
	}
    /**
     * Return 2 arrays dựoc hỗ trợ bởi smarty html_option
     * @param string $sql, câu lệnh sql
     * @param string $Field1, trườnd đầu tien của bảng bên trong câu lệnh sql
     * @param string $numrow, trường thứ 2 của bảng trong câu lệnh sql
     * @param string $rs1, kết quả của việc xử lý $Field1
     * @param string $rs2, kết quả của việc xử lý $Field2
     * @return trả về mảng gồm các phần tử chứa $rs1, $rs2
     */
	function RowsFields($sql,$Field1,$Field2,&$rs1,&$rs2)
	{
		$result=mysql_query($sql) or die("Not query fns_Rows");
		$rs1=array();
		$rs2=array();
		while($r=mysql_fetch_array($result))
		{
			$rs1[]=$r[$Field1];
			$rs2[]=$r[$Field2];
		}
		return $result;
	}
    /**
     * Trả về trạng thái -1, 0, 1 của việc xử lý tham số đầu vào
     * @param string $sql, câu lệnh sql
     * return 	0: nếu thành công
     * 		-1: nếu sai
     *		 1: nếu sai
     * @return -1 hoặc 0 hoặc 1
     */
	function Execute($sql)
	{
		try{
		$result=mysql_query($sql);
		}
		catch(Exception $e)
		{
		return -1;
		}
		if($result)
			return 0;
		else
			return 1;
	}	
	function affectedRows()
	{
		try{
			return mysql_affected_rows();			
		}catch (	Exception $e){
			return -1;
		}
		
	}
     /**
     * trả về mảng đựoc hỗ trợ bởi các vòng lắp trong smarty(section or foreach)
     * @param string $sql, câu lệnh truy vấn
     * @return trả về mảng có dạng array(array()[,array()])
     */
	function Rows($sql)
	{
		if(isset($this->conn)){
			$result=mysql_query($sql,$this->conn) or die("Not query fns_Rows");
		}
		else{
			$result=mysql_query($sql) or die("Not query fns_Rows");
		}
		$rows=array();
		while($r=mysql_fetch_array($result)){
			$rows[]=$r;
		}
		return $rows;
	}
   /**
     * trả về mảng dũ liệu truy vấn từ câu select
     * @param string $sql, câu lệnh truy vấn
     * @param string $Field,tên trường trong câu lệnh truy vấn
     * @return trả về mảng
     */
	function RowsField($sql,$Field)
	{
		$result=mysql_query($sql) or die("Not query fns_Rows");
		$rows=array();
		while($r=mysql_fetch_array($result))
		{
			$rows[]=$r[$Field];
		}
		return $rows;
	}
    /**
     * getNumRows trả về số dòng truy vấn được từ kết quả truy vấn
     * @param string $sql, câu lệnh truy vấn
     * @return trả về tổng dòng tuy vấn được
     */
	function getNumRows($sql)
	{
		$result = mysql_query($sql);
		if($result)
		{
			return mysql_num_rows($result);
		}
	}
    /**
     * getTbConstRows trả về tất cả thông tin cấu hình
     * @param string $name, tên kiểu thông tin
     * @return trả về thông tin câus hình
     */
	function getTbConstRows($name)
	{
		$sql = "SELECT * FROM tb_const WHERE Name = '$name' ";
		$obj = $this->getObject($sql);
		return $obj;
	}	
    /**
     * trả về id của bản ghi được insert gần nhất
    * @param không tham s
    * @return id của bản ghi vừa đựoc insert
     */
	function getInsertId()
	{
		return mysql_insert_id();
	}
	/*
	*execute query and return
	*/
	function queryResult($sql)
	{	
		return mysql_query($sql);
	}
	/*mysql_fetch_object*/
	function fetchObject($result)
	{
		try {
			return mysql_fetch_object($result);
		}catch (Exception $e){
			return null;
		}
	}	
	/**
	 *  hàm lấy danh sách từ một cái con trả về danh sách các phần tử và thêm vào
	 * @param int $id chỉ số id cha, nếu =0 lấy tất cả các phần tử gốc
	 * @param int $curDepth độ sâu của cây, liên quan đến việc lặp trong $al, thường gọi =0 khi là cha
	 * @param  string $Left biểu tượng trái ví dụ như tạo bảng, tạo dòng
	 * @param string $al biểu tượng lặp để đánh dấu độ sâu. Ví dụ $stAdd=$Left.str_repeat($al,$curDepth).$L ;
	 * @param string $L biểu tượng trái sau khi kết thúc lặp
	 * @param string $Right biểu tượng phải sau khi kết thúc lặp. Ví dụ: CONCAT('$stAdd' , A1.$f2,'.$Right')
	 * @param string $tableName tên của bảng cần lấy dữ liệu
	 * @param string $f1 tên trường chứa id
	 * @param  string $f2 tên trường chứa tên
	 * @param string $f3 tên trường chứa đến tham chiếu cha
	 * @param string $fo các trường khác cần thêm vào, ban đầu phía dưới phải có , và các trường phải cách nhau , đây là mô hình thêm vào sau câu lệnh select
	 * @return array() null nếu không có phần tử nào, nếu thành công mảng các object($f1,$f2,$f3)
	 *  @example  $a=$d->getChildren(0,0,"<table><tr>","<td width=''10''>+</td>","<td>","</td></tr></table>","tb_group_cpn","ID","Name","parentID");
	 * @example  $a=$d->getChildren(0,0,"+","----",">","</br>","tb_group_cpn","ID","Name","parentID");
	 * @example  $a=$d->getChildren(0,0,"<table><tr>","<td width=''10''></td>","<td width=''10''>+</td><td>","</td></tr></table>","tb_group_cpn","ID","Name","parentID");
	 */
	function getChildren($id, $curDepth,$Left,$al,$L,$Right,$tableName, $f1,$f2,$f3,$fo)
	{
		$aret=array();
		$stAdd=$Left.$L;
		if($curDepth>0){
			$stAdd=$Left.str_repeat($al,$curDepth).$L ;
		}
		if($id==0){
			$sql="SELECT
				A1.$f1,
				CONCAT('$stAdd' , A1.$f2,'.$Right') as $f2,
				A1.$f3 $fo
				FROM $tableName AS A1
				WHERE
				A1.$f3 =  $id OR A1.$f3 is null";
		}else{
			$sql="SELECT
				A1.$f1,
				CONCAT('$stAdd' , A1.$f2,'.$Right') as $f2,
				A1.$f3 $fo
				FROM $tableName AS A1
				WHERE
				A1.$f3 =  $id ";
//			echo $sql;
		}
//		echo $sql;
		$result=mysql_query($sql);	
		if(!$result){
			return null;
		}
		while ($row = mysql_fetch_object($result)) {
			$aret[]=$row;	
			$temp=$this->getChildren($row->$f1,$curDepth+1,$Left,$al,$L,$Right,$tableName,$f1,$f2,$f3,$fo);
			if($temp!=null){
				foreach($temp as $item){
					$aret[]=$item;
				}
			}
		}
		return $aret;
	}
	function getSQLChildren($id, $curDepth,$Left,$al,$L,$Right,$tableName, $f1,$f2,$f3,$fo)
	{
		$aret=array();
		$stAdd=$Left.$L;
		if($curDepth>0){
			$stAdd=$Left.str_repeat($al,$curDepth).$L ;
		}
		if($id==0){
			$sql="SELECT
				A1.$f1,
				CONCAT('$stAdd' , A1.$f2,'.$Right') as $f2,
				A1.$f3 $fo
				FROM $tableName AS A1
				WHERE
				A1.$f3 =  $id OR A1.$f3 is null";
		}else{
			$sql="SELECT
				A1.$f1,
				CONCAT('$stAdd' , A1.$f2,'.$Right') as $f2,
				A1.$f3 $fo
				FROM $tableName AS A1
				WHERE
				A1.$f3 =  $id ";
//			echo $sql;
		}
//		echo $sql;
		return $sql;
	}	
	
}	
?>